package priv.conceit.study.book.thread.chapter2.parts6;

import java.util.concurrent.TimeUnit;

/**
 * 2.6
 * 守护线程
 * 守护线程是一类比较特殊的线程，一般用于处理一些后台的工作，比如jdk的gc线程
 * <p>
 * 前置问题
 * jvm在什么情况下会退出
 * -在正常情况下 若jvm中没有一个非守护线程，则jvm会退出
 * -不包括system.exit()方法
 * <p>
 * 守护线程的作用
 * 根据上述可得 如果jvm中没有一个正常线程（非守护线程），则jvm会退出
 * 也可以理解为守护线程具备自动结束生命周期的特点
 * <p>
 * 守护线程的意义
 * 比如游戏后台线程，我们有一个后台线程不断的去获取当前玩家的金币
 * 如果玩家已经退出游戏 我们也希望该线程能自动退出
 * 就比如 你吃面 点完面后 送面的阿姨会给你送面（守护线程），都没人来吃面了，送饭阿姨也就不在工作了
 *
 * @author Conceit
 * @since 1.0.0, 2019/6/10
 */
public class DaemonThread {

	public static void main(String[] args) {
		testDaemonThread(false);
	}


	/**
	 * 手动创建的线程 不设置为守护线程 即使是main线程已经退出 自己也不会退出
	 * 原因是jvm进程中 还存在一个非守护线程
	 * <p>
	 * 相反 子线程会继承父线程的Daemon属性 main线程模式不是守护线程
	 *
	 * @param isDaemon
	 */
	public static void testDaemonThread(boolean isDaemon) {
		Thread thread = new Thread() {

			@Override
			public void run() {

				while (true) {
					try {
						TimeUnit.SECONDS.sleep(1L);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

			;
		};
		//是否设置为守护线程
		thread.setDaemon(isDaemon);
		thread.setName("testDaemonThread");
		System.out.println(thread.getName() + "线程是否为 守护线程-->" + thread.isDaemon());
		thread.start();

		try {
			System.out.println("当前main线程是否为 守护线程-->" + Thread.currentThread().isDaemon());
			TimeUnit.SECONDS.sleep(2_0L);

		} catch (InterruptedException e) {
			e.printStackTrace();
		}


	}

}
